package sistemadeecuacioneslineales;

import java.lang.Math;

public class VectorMath
{

	private float[] vec;
	int tam;

	public VectorMath(int tam)
	{
		this.tam = tam;
		if (tam == 0)
			vec = null;
		else
		{
			vec = new float[tam];
			for (int i = 0; i < tam; i++)
			{
				vec[i] = 0;
			}
		}
	}

	public VectorMath()
	{
		this(0);
	}

	// CONSTRUCTOR DE COPIA
	public VectorMath(VectorMath obj)
	{
		tam = obj.tam;
		if (tam != 0)
		{
			vec = new float[tam];
			for (int i = 0; i < tam; i++)
				vec[i] = obj.vec[i];
		} else
			vec = null;

	}

	// OPERATOR =
	public void clone(VectorMath obj) {
		tam = obj.tam;
		if (tam != 0)
		{
			vec = new float[tam];
			for (int i = 0; i < tam; i++)
				vec[i] = obj.vec[i];
		}
		else
			vec = null;
	}

	// SUMAR
	public VectorMath sumar(VectorMath obj)
	{
		VectorMath aux = new VectorMath(tam);

		if (aux.tam == obj.tam)
		{
			for (int i = 0; i < aux.tam; i++)
				aux.vec[i] = vec[i] + obj.vec[i];
		}
		else
		{
			System.out.println("No es posible realizar la suma");
		}

		return aux;
	}

	// OPERATOR -
	public VectorMath restar(VectorMath obj)
	{
		VectorMath aux = new VectorMath(tam);
		if (aux.tam == obj.tam)
		{
			for (int i = 0; i < aux.tam; i++)
				aux.vec[i] = vec[i] - obj.vec[i];
		}
		else
		{
			System.out.println("No es posible realizar la resta");
		}
		return aux;
	}

	// OPERATOR * (Vector * Escalar)
	public VectorMath multiplicar(float num)
	{
		VectorMath aux = new VectorMath(tam);
		for (int i = 0; i < tam; i++)
			aux.vec[i] = vec[i] * num;
		return aux;
	}

	// OPERATOR * (Vector * Vector)

	public float multiplicar(VectorMath obj)
	{
		float multiplicacion = 0;

		if (tam == obj.tam)
			for (int i = 0; i < tam; i++)
				multiplicacion += (vec[i] * obj.vec[i]);
		else
		{
			System.out.println("No es posible realizar Vector * Vector ");
		}

		return multiplicacion;
	}

	// OPERATOR ==
	boolean equals(VectorMath obj)
	{
		if (tam == obj.tam) {
			for (int i = 0; i < tam; i++)
				if (vec[i] != obj.vec[i])
					return false;
		} else
			return false;

		return true;
	}

	// OPERATOR <

	boolean menor(VectorMath obj)
	{
		if (tam < obj.tam)
			return true;

		return false;
	}

	// OPERATOR >
	boolean mayor(VectorMath obj)
	{
		if (tam > obj.tam)
			return true;
		return false;
	}

	// OPERATOR []
	float getValue(int pos)
	{

		
		return vec[pos];
	}

	// OPERATOR []
	void setValue(int pos, float value)
	{
		vec[pos] = value;
		
	}

	public float normaUno()
	{
		float resultado = 0;
		for (int i = 0; i < vec.length; i++)
		{
			resultado += Math.abs(vec[i]);
		}
		return resultado;
	}

	public float normaDos()
	{
		float resultado = 0;
		for (int i = 0; i < vec.length; i++)
		{
			resultado += Math.pow(vec[i], 2);
		}
		return (float) Math.sqrt(resultado);
	}

	public float normaInfinito()
	{
		float resultado = 0;
		for (int i = 0; i < vec.length; i++)
		{
			if (vec[i] > resultado)
				resultado = Math.abs(vec[i]);
		}
		return resultado;
	}

	// FUNCION TEST

	public boolean test()
	{
		VectorMath v1 = new VectorMath(5);
		VectorMath v2 = new VectorMath(5);

		VectorMath sumaV1yV2 = new VectorMath(5);
		VectorMath resultadoSumaV1yV2 = new VectorMath(5);

		VectorMath restaV1yV2 = new VectorMath(5);
		VectorMath resultadoRestaV1yV2 = new VectorMath(5);

		if (!v1.equals(v2))
			return false;

		for (int i = 0; i < v1.tam; i++)
		{
			v1.setValue(i, 6);
			v2.setValue(i, 4);
			sumaV1yV2.setValue(i, 10);
			restaV1yV2.setValue(i, 2);
		}

		resultadoSumaV1yV2 = v1.sumar(v2);

		if (v1.equals(v2))
			return false;

		if (!resultadoSumaV1yV2.equals(sumaV1yV2))
			return false;

		resultadoRestaV1yV2 = v1.restar(v2);

		if (!resultadoRestaV1yV2.equals(restaV1yV2))
			return false;

		if (v1.multiplicar(v2) != 120)
			return false;

		if (v1.normaUno() != 30)
			return false;

		if ((int) v1.normaDos() != (int) Math.sqrt(180))
			return false;

		if (v1.normaInfinito() != 6)
			return false;

		return true;
	}
}
